package com.kpi.myfloatwindow;

import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Build;
import android.view.View;
import android.view.WindowManager;


public class FloatPhone {

    private final Context mContext;

    private final WindowManager mWindowManager;
    private final WindowManager.LayoutParams mLayoutParams;
    private View mView;
    private int mX, mY;

    FloatPhone(Context applicationContext) {
        mContext = applicationContext;
        // 获取WindowManager服务
        mWindowManager = (WindowManager) applicationContext.getSystemService(Context.WINDOW_SERVICE);
        // 设置LayoutParam
        mLayoutParams = new WindowManager.LayoutParams();
        mLayoutParams.format = PixelFormat.RGBA_8888;//设置期望的位图格式。默认为不透明
        /**
         * WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 即使在该window在可获得焦点情况下，允许该窗口之外的点击事件传递到当前窗口后面的的窗口去
         * WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 窗口不能获得焦点
         * WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 允许窗口超出整个手机屏幕
         */
//        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
//                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
//                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        mLayoutParams.width = 200;
        mLayoutParams.height = 200;
    }

    public void setView(View view){
        mView = view;
    }

    public void init(){
        req();
    }

    /**
     *指定窗口类型 并加入控件对象
     *
     * WindowManager.LayoutParams.type取值如下：
     //应用程序窗口。
     public static final int FIRST_APPLICATION_WINDOW = 1;

     //所有程序窗口的“基地”窗口，其他应用程序窗口都显示在它上面。
     public static final int TYPE_BASE_APPLICATION =1;

     //普通应用功能程序窗口。token必须设置为Activity的token，以指出该窗口属谁。
     public static final int TYPE_APPLICATION = 2;

     //用于应用程序启动时所显示的窗口。应用本身不要使用这种类型。
     //它用于让系统显示些信息，直到应用程序可以开启自己的窗口。
     public static final int TYPE_APPLICATION_STARTING = 3;

     //应用程序窗口结束。
     public static final int LAST_APPLICATION_WINDOW = 99;

     //子窗口。子窗口的Z序和坐标空间都依赖于他们的宿主窗口。
     public static final int FIRST_SUB_WINDOW = 1000;

     //面板窗口，显示于宿主窗口上层。
     public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;

     //媒体窗口，例如视频。显示于宿主窗口下层。
     public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1;

     //应用程序窗口的子面板。显示于所有面板窗口的上层。（GUI的一般规律，越“子”越靠上）
     public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;

     //对话框。类似于面板窗口，绘制类似于顶层窗口，而不是宿主的子窗口。
     public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;

     //媒体信息。显示在媒体层和程序窗口之间，需要实现透明（半透明）效果。（例如显示字幕）
     public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW +4;

     //子窗口结束。（ End of types of sub-windows ）
     public static final int LAST_SUB_WINDOW = 1999;

     //系统窗口。非应用程序创建。
     public static final int FIRST_SYSTEM_WINDOW = 2000;

     //状态栏。只能有一个状态栏；它位于屏幕顶端，其他窗口都位于它下方。
     public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;

     //搜索栏。只能有一个搜索栏；它位于屏幕上方。
     public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1;

     //电话窗口。它用于电话交互（特别是呼入）。它置于所有应用程序之上，状态栏之下。
     public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;

     //系统提示。它总是出现在应用程序窗口之上。
     public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW +3;

     //锁屏窗口。
     public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW +4;

     //信息窗口。用于显示toast。
     public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW +5;

     //系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点，否则影响锁屏。
     public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW +6;

     //电话优先，当锁屏时显示。此窗口不能获得输入焦点，否则影响锁屏。
     public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW +7;

     //系统对话框。（例如音量调节框）。
     public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW +8;

     //锁屏时显示的对话框。
     public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW +9;

     //系统内部错误提示，显示于所有内容之上。
     public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW +10;

     //内部输入法窗口，显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖。
     public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW +11;

     //内部输入法对话框，显示于当前输入法窗口之上。
     public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12;

     //墙纸窗口。
     public static final int TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW +13;

     //状态栏的滑动面板。
     public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW +14;

     //系统窗口结束。
     public static final int LAST_SYSTEM_WINDOW = 2999;

     */
    private void req() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //Android 8.0及以上
            //指定窗口类型
            mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            //指定窗口类型
            mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        }
        //加入控件对象
        mWindowManager.addView(mView, mLayoutParams);
    }


    public void updateXY(int x, int y) {
        mLayoutParams.x = mX = x;
        mLayoutParams.y = mY = y;
        mWindowManager.updateViewLayout(mView, mLayoutParams);
    }

    public void updateX(int x) {
        mLayoutParams.x = mX = x;
        mWindowManager.updateViewLayout(mView, mLayoutParams);
    }

    public void updateY(int y) {
        mLayoutParams.y = mY = y;
        mWindowManager.updateViewLayout(mView, mLayoutParams);
    }

    public int getX(){
        return mX;
    }

    public int getY(){
        return mY;
    }
}
